import { MaybeRefOrGetter } from 'vue'
import { UseElementBoundingReturn, UseScrollOptions } from '@vueuse/core'
import { LimitCallOptionsType } from '@xtail/core'
import { ElVisibilityStatusConstType, ScrollDirectionConstType } from '../../common'

export const VisibilityDetailHandlerType_Name = 'VisibilityDetailHandlerType'
export const VisibilityDetailHandlerLimitExcludeType_Name =
  'VisibilityDetailHandlerLimitExcludeType'
export const VisibilityDetailPropsType_Name = 'VisibilityDetailPropsType'

/**
 * 组件参数中各个回调函数参数的类型
 */
export type VisibilityDetailHandlerType = (
  bounding: UseElementBoundingReturn,
  containerBounding: UseElementBoundingReturn
) => void

/**
 * 组件参数中用于配置回调函数调用次数限制中不执行回调函数情况的函数参数的类型
 */
export type VisibilityDetailHandlerLimitExcludeType = (
  visibility: ElVisibilityStatusConstType
) => boolean

/**
 * 组件参数中用于配置各个回调函数调用次数限制的配置选项参数的类型
 */
type VisibilityDetailHandlerLimitOptionsType = Omit<LimitCallOptionsType, 'maxCount' | 'exclude'>

export type VisibilityDetailPropsType = {
  // 滚动容器元素，默认组件的父元素
  container?: MaybeRefOrGetter<HTMLElement | SVGElement | Window | Document | null | undefined>
  // 滚动容器元素 VueUse useScroll API 配置选项
  useScrollOptions?: UseScrollOptions
  // 扩大或缩小浏览器视口的区域范围，正值：扩大范围，使目标元素更早触发进入回调或更晚触发离开回调；负值：收缩范围，使目标元素更晚触发进入回调或更早触发离开回调
  margin?: number[]
  // 组件完全显示之前的回调函数
  beforeShow?: VisibilityDetailHandlerType
  // 组件完全显示之前的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  beforeShowLimit?: number
  // 组件完全显示之前的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  beforeShowLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 组件完全显示之前的回调函数的调用次数限制配置选项
  beforeShowLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 组件完全显示后的回调函数
  showed?: VisibilityDetailHandlerType
  // 组件完全显示后的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  showedLimit?: number
  // 组件完全显示后的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  showedLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 组件完全显示后的回调函数的调用次数限制配置选项
  showedLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 组件完全隐藏之前的回调函数
  beforeHide?: VisibilityDetailHandlerType
  // 组件完全隐藏之前的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  beforeHideLimit?: number
  // 组件完全隐藏之前的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  beforeHideLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 组件完全隐藏之前的回调函数的调用次数限制配置选项
  beforeHideLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 组件完全隐藏后的回调函数
  hidden?: VisibilityDetailHandlerType
  // 组件完全隐藏后的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  hiddenLimit?: number
  // 组件完全隐藏后的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  hiddenLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 组件完全隐藏后的回调函数的调用次数限制配置选项
  hiddenLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 容器未发生滚动，监听的方向
  directionNotScroll?: ScrollDirectionConstType
  // 容器未发生滚动，组件处于完全显示之前的状态的回调函数
  beforeShowNotScroll?: VisibilityDetailHandlerType
  // 容器未发生滚动，组件处于完全显示之前的状态的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  beforeShowNotScrollLimit?: number
  // 容器未发生滚动，组件处于完全显示之前的状态的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  beforeShowNotScrollLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 容器未发生滚动，组件处于完全显示之前的状态的回调函数的调用次数限制配置选项
  beforeShowNotScrollLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 容器未发生滚动，组件处于完全显示后的状态的回调函数
  showedNotScroll?: VisibilityDetailHandlerType
  // 容器未发生滚动，组件处于完全显示后的状态的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  showedNotScrollLimit?: number
  // 容器未发生滚动，组件处于完全显示后的状态的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  showedNotScrollLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 容器未发生滚动，组件处于完全显示后的状态的回调函数的调用次数限制配置选项
  showedNotScrollLimitOptions?: VisibilityDetailHandlerLimitOptionsType
  // 容器未发生滚动，组件处于完全隐藏后的状态的回调函数
  hiddenNotScroll?: VisibilityDetailHandlerType
  // 容器未发生滚动，组件处于完全隐藏后的状态的回调函数的调用次数限制，-1 表示无限制，默认值为 -1
  hiddenNotScrollLimit?: number
  // 容器未发生滚动，组件处于完全隐藏后的状态的回调函数的调用次数限制中，不执行回调函数的情况，返回 true 表示不执行回调函数
  hiddenNotScrollLimitExclude?: VisibilityDetailHandlerLimitExcludeType
  // 容器未发生滚动，组件处于完全隐藏后的状态的回调函数的调用次数限制配置选项
  hiddenNotScrollLimitOptions?: VisibilityDetailHandlerLimitOptionsType
}
